package com.chen.dao;


import com.chen.pojo.PageBean;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;



/**
 * 基础数据库操作类
 *
 * @author chenxiao
 *
 */
@Transactional
public interface BaseDAO<T> {

	/**
	 * 保存一个对象
	 *
	 * @param o
	 * @return
	 */
	Serializable save(T o);

	/**
	 * 删除一个对象
	 *
	 * @param o
	 */
	void delete(T o);

	/**
	 * 删除一个对象
	 * @param hql
	 * @return
	 */
	int delete(String hql);

	/**
	 * 更新一个对象
	 *
	 * @param o
	 */
	void update(T o);

	/**
	 * 保存或更新对象
	 *
	 * @param o
	 */
	void saveOrUpdate(T o);

	/**
	 * 保存或更新对象
	 *
	 * @param hql
	 */
	int saveOrUpdate(String hql);

	/**
	 * 合并对象
	 *
	 * @param o
	 */
	void merge(T o);

	/**
	 * 查询
	 *
	 * @param hql
	 * @return
	 */
	List<T> find(String hql);

	/**
	 * 查询集合
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	List<T> find(String hql, Object[] param);

	/**
	 * 查询集合
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	List<T> find(String hql, List<Object> param);

	/**
	 * 查询集合(带分页)
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	List<T> find(String hql, Object[] param, PageBean pageBean);

	/**
	 * 查询集合(带分页)
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	List<T> find(String hql, List<Object> param, PageBean pageBean);

	/**
	 * 获得一个对象
	 *
	 * @param c
	 *            对象类型
	 * @param id
	 * @return Object
	 */
	T get(Class<T> c, Serializable id);

	/**
	 * 获得一个对象
	 *
	 * @param hql
	 * @param param
	 * @return Object
	 */
	T get(String hql, Object[] param);

	/**
	 * 获得一个对象
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	T get(String hql, List<Object> param);

	/**
	 * select count(*) from 类
	 *
	 * @param hql
	 * @return
	 */
	Long count(String hql);

	/**
	 * select count(*) from 类
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	Long count(String hql, Object[] param);

	/**
	 * select count(*) from 类
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	Long count(String hql, List<Object> param);

	/**
	 * 执行HQL语句
	 *
	 * @param hql
	 * @return 响应数目
	 */
	Integer executeHql(String hql);

	/**
	 * 执行HQL语句
	 *
	 * @param hql
	 * @param param
	 * @return 响应数目
	 */
	Integer executeHql(String hql, Object[] param);

	/**
	 * 执行HQL语句
	 *
	 * @param hql
	 * @param param
	 * @return
	 */
	Integer executeHql(String hql, List<Object> param);

	/**
	 * 执行SQL语句
	 *
	 * @param sql
	 * @return
	 */
	Integer executeSql(String sql);
}
